package com.sd365.permission.centre.api.controller;

import com.sd365.common.log.api.annotation.ApiLog;
import com.sd365.common.util.BeanUtil;
import com.sd365.permission.centre.api.RoleApi;
import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.*;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.*;
import com.sd365.permission.centre.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

/**
 * @program: sd365-permission-centre
 * @description: 角色管理Controller实现类  ，实现RoleApi接口实现界面接口所定义的方法
 * @author: shixusheng
 * @create: 2022-12-23 13:03
 **/
@CrossOrigin
@RestController
public class RoleController implements RoleApi {

    /**
     * 角色服务类
     */
    @Autowired
    private RoleService roleService;

    /**
     * @Description: 在系统启动时候将初始化角色和资源的关系，主要为网关鉴权服务
     * @Author: shixusheng
     * @DATE: 2022-12-23  13:49
     * @param: 不同的角色初始化不同的资源到内存
     * @return:  Boolean
     */
    @Override
    public Boolean initRoleResourceRedis(Role role) {
        return roleService.initRoleResourceRedis(role);
    }

    /**
     * @Description: 批量插入，插入前先删除原来的角色和资源的关系
     * @Author: shixusheng
     * @DATE: 2022-12-23  13:55
     * @param: 前端选择的角色资源列表
     * @return: Boolean
     */
    @ApiLog
    @Override
    public Boolean assignResource(@Valid RoleResourceDTO roleResourceDTO) {
        return roleService.assignResource(roleResourceDTO);
    }

    /**
     * @Description: 为角色分配用户，因为涉及多条插入记得启动事务管理
     * @Author: 史旭升
     * @DATE: 2022-12-23  15:51
     * @param:  当前勾选的用户以及从用户查询对话框多选的用户
     * @return: Boolean
     */
    @ApiLog
    @Override
    public Boolean assignUser(@Valid UserRoleDTO userRoleDTO) {
        return roleService.assignUser(userRoleDTO);
    }


    /**
     * 查看角色的通过角色id获取该角色拥有的资源,角色界面未发起对该方法考虑非在角色管理模块
     * 使用，所以培训项目不要求实现改方法 请忽略该方法的实现
     * @Author: 史旭升
     * @DATE: 2022-12-24  12:51
     * @param roleQuery 支持传入id和名字 建议参数和名字保持一致有待改进
     * @return Node
     */
    @ApiLog
    @Override
    public List<Node> doQueryResourceByRoleId(@Valid RoleQuery roleQuery) {
        return roleService.queryResourceByRoleId(roleQuery.getId());
    }

    /**
     * 通过角色id获取该角色拥有的资源
     * @Author: 史旭升
     * @DATE: 2022-12-24  12:47
     * @param
     * @return Node
     */
    @Override
    public List<Node> selectCompany() {
        return roleService.selectCompany();
    }

    /**
     * 验证角色是否重复
     * @author shi xusheng
     * @date 2022/12/25 10:22
     * @param roleDTO 角色名
     * @return Node
     */
    @ApiLog
    @Override
    public boolean haveRole(@Valid RoleDTO roleDTO) {
        return roleService.haveRole(roleDTO);
    }

    /**
     *增加角色
     * @author shi xusheng
     * @date 2022/12/26 12:07
     * @param roleDTO
     * @return java.lang.Boolean
     */
    @ApiLog
    @Override
    public Boolean add(@Valid RoleDTO roleDTO) {
        return roleService.add(roleDTO);
    }

    /**
     *删除角色，要删除和角色关联的表的所有相关数据
     * @author shi xusheng
     * @date 2022/12/26 12:08
     * @param id
     * @param version
     * @return java.lang.Boolean
     */
    @ApiLog
    @Override
    public Boolean remove(Long id, Long version) {
        return roleService.remove(id, version);
    }

    /**
     * @Description: 批量删除角色，注意要记得删除角色关联的资源
     * @Author: Administrator
     * @DATE: 2022-12-26  14:24
     * @param: 角色id 如果传送id数组更好，建议培训阶段执行的项目的时候改进
     * @return: 成功则true 否则false
     */
    @ApiLog
    @Override
    public Boolean batchRemove(@Valid RoleDTO[] roleDTOS) {
        return roleService.batchRemove(roleDTOS);
    }

    /**
     * @Description: 修改角色信息
     * @Author: 史旭升
     * @DATE: 2022-12-26  15:22
     * @param: roleDTO
     * @return: boolean
     */
    @ApiLog
    @Override
    public Boolean modify(@Valid RoleDTO roleDTO) {
        return roleService.modify(roleDTO);
    }

    /**
     * @Description: 执行数据的查询然后在展示在拷贝对话框，请不要被方法名所迷惑
     * @Author: shixusheng
     * @DATE: 2022-12-26  16:28
     * @param: 角色id
     * @return: RoleDTO
     */
    @ApiLog
    @Override
    public RoleDTO copy(Long id) {
        return roleService.copy(id);
    }

    /**
     *分页查询
     * @author shi xusheng
     * @date 2022/12/26 10:12
     * @param roleQuery
     * @return java.util.List<com.sd365.permission.centre.pojo.dto.RoleDTO>
     */
    @ApiLog
    @Override
    public List<RoleVO> commonQuery(RoleQuery roleQuery) {
        List<RoleDTO> roleDTOS = roleService.commonQuery(roleQuery);
        return BeanUtil.copyList(roleDTOS, RoleVO.class);
    }

    /**
     *角色管理模块 分配用户时的用户查询
     * @author shi xusheng
     * @date 2022/12/26 11:04
     * @param userQuery
     * @return java.util.List<com.sd365.permission.centre.pojo.dto.UserDTO>
     */
    @ApiLog
    @Override
    public List<UserVO> commonQueryUser(@Valid UserQuery userQuery) {
        return roleService.commonQueryUser(userQuery);
    }

    /**
     *通过id查询
     * @author shi xusheng
     * @date 2022/12/26 17:06
     * @param id
     * @return com.sd365.permission.centre.pojo.dto.RoleDTO
     */
    @ApiLog
    @Override
    public RoleVO queryRoleById(Long id) {
       return roleService.queryById(id);
    }

    /**
     * @Description: 查询用户资源 BY ID
     * @Author: 史旭升
     * @DATE: 2022-12-26  19:17
     * @param: 用户id
     * @return: 用户对象的角色
     */
    @ApiLog
    @Override
    public RoleVO queryUserResource(Long id) {
        RoleDTO roleDTO = roleService.queryUserResource(id);
        return roleService.getCopyRoleVO(roleDTO);
    }


    /**
     * @Description: 通过id查询角色公司关系，培训项目不要求实现功能点
     * @Author: 史旭升
     * @date 2022-12-26
     * @param id
     * @return RoleCompanyVO
     */
    @ApiLog
    @Override
    public RoleCompanyVO queryRoleCompanyById(Long id) {
        return roleService.queryRoleCompanyById(id);
    }

    /**
     * @Description:修改角色公司关系 培训项目不要求实现功能点
     * @Author: 史旭升
     * @date 2022-12-26
     * @param roleCompanyDTO
     * @return Boolean
     */
    @ApiLog
    @Override
    public Boolean modifyRoleCompany(RoleCompanyDTO roleCompanyDTO) {
        return roleService.modifyRoleCompany(roleCompanyDTO);
    }
}

